Week2-Dynamic-Web-Architecture
Week 2: 동적 웹 애플리케이션 아키텍처 (2-Tier)
EC2와 RDS를 활용한 데이터베이스 연동 동적 웹 애플리케이션 구축

아키텍처 개요
인터넷 사용자
↓ HTTP/HTTPS 요청
Internet Gateway
↓
VPC (10.0.0.0/16)
├── Public Subnet (10.0.1.0/24)
│ └── EC2 (Node.js + Express)
│ ├── 웹 서버
│ ├── 애플리케이션 서버
│ └── 비즈니스 로직
└── Private Subnet (10.0.2.0/24)
└── RDS MySQL (데이터베이스)
상세 네트워크 아키텍처
VPC 설계
VPC: webapp-vpc (10.0.0.0/16)
│
├── Internet Gateway: webapp-igw
│ └── 인터넷 연결 관문
│
├── Public Subnet: webapp-public-subnet
│ ├── CIDR: 10.0.1.0/24 (256개 IP)
│ ├── 가용영역: ap-northeast-2a
│ ├── 인터넷 라우팅: 있음
│ └── Auto-assign Public IP: 활성화
│
└── Private Subnet: webapp-private-subnet
├── CIDR: 10.0.2.0/24 (256개 IP)
├── 가용영역: ap-northeast-2a
├── 인터넷 라우팅: 없음
└── DB 서브넷 그룹 사용
라우팅 테이블
Public Route Table:
├── 10.0.0.0/16 → local (VPC 내부 통신)
└── 0.0.0.0/0 → igw-xxxx (인터넷 게이트웨이)
Private Route Table:
└── 10.0.0.0/16 → local (VPC 내부 통신만)
핵심 구성 요소
1. EC2 웹 서버 (Public Subnet)
인스턴스 사양:
- 타입: t2.micro (1 vCPU, 1GB RAM)
- OS: Amazon Linux 2023
- 스토리지: 8GB gp3 EBS
- 네트워크: Public IPv4 주소 할당
설치된 소프트웨어:
Node.js v18+
├── Express.js (웹 프레임워크)
├── MySQL2 (데이터베이스 드라이버)
├── PM2 (프로세스 관리자)
└── 사용자 정의 웹 애플리케이션
보안 그룹 (webapp-web-sg):
인바운드 규칙:
├── SSH (22) ← 내 IP만
├── HTTP (80) ← 0.0.0.0/0
├── Custom (3000) ← 0.0.0.0/0 (Node.js 앱)
└── Custom (8080) ← 0.0.0.0/0 (개발용)
아웃바운드 규칙:
└── All traffic → 0.0.0.0/0
2. RDS MySQL (Private Subnet)
데이터베이스 사양:
- 엔진: MySQL 8.0
- 클래스: db.t3.micro (1 vCPU, 1GB RAM)
- 스토리지: 20GB gp2
- 백업: 7일 보관
네트워크 설정:
DB 서브넷 그룹: webapp-db-subnet-group
├── Private Subnet (ap-northeast-2a)
└── Private Subnet (ap-northeast-2c) - 백업용
보안 그룹 (webapp-db-sg):
├── MySQL (3306) ← webapp-web-sg만
└── 아웃바운드 차단
애플리케이션 아키텍처
Node.js 애플리케이션 구조
/home/ec2-user/webapp/
├── app.js (메인 애플리케이션)
├── package.json (의존성 관리)
├── routes/
│ ├── index.js (기본 라우트)
│ └── users.js (사용자 관리)
├── views/
│ ├── index.ejs (메인 페이지)
│ └── users.ejs (사용자 목록)
└── config/
└── database.js (DB 연결 설정)
데이터베이스 스키마
Database: webapp_db
Table: users
├── id (INT, PRIMARY KEY, AUTO_INCREMENT)
├── name (VARCHAR(100), NOT NULL)
├── email (VARCHAR(100), UNIQUE, NOT NULL)
├── created_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP)
└── updated_at (TIMESTAMP, DEFAULT CURRENT_TIMESTAMP ON UPDATE)
데이터 흐름
웹 페이지 요청 흐름
1. 사용자가 브라우저에서 접속
http://EC2-Public-IP/
2. Internet Gateway를 통해 VPC 진입
3. Public Subnet의 EC2로 라우팅
4. Node.js Express 서버가 요청 처리
├── 정적 파일 (HTML, CSS, JS) → 직접 응답
└── 동적 데이터 필요 → 5단계로
5. EC2에서 RDS MySQL 쿼리
Private Subnet 내부 통신 (10.0.1.x → 10.0.2.x)
6. 데이터베이스 결과를 받아서 HTML 렌더링
7. 완성된 페이지를 사용자에게 응답
보안 설정
네트워크 보안
계층별 보안:
├── Internet Gateway: 인터넷 접근점 (1개소만)
├── Public Subnet: 웹 서버만 인터넷 노출
├── Private Subnet: 데이터베이스 완전 격리
└── 보안 그룹: 포트별 세밀한 접근 제어
접근 제어
SSH 접근:
├── 키 페어 인증만 허용
├── 내 IP 주소만 허용
└── root 로그인 비활성화
데이터베이스:
├── Private 서브넷 격리
├── 웹 서버에서만 접근 허용
├── 강력한 비밀번호 사용
└── 환경 변수로 자격 증명 관리
성능 특성
처리 능력
t2.micro 인스턴스 기준:
├── 동시 접속자: ~50-100명
├── 응답 시간: 200-500ms
├── 처리량: ~100 requests/sec
└── 메모리 사용량: ~500MB
병목 지점
잠재적 제약 사항:
├── EC2 단일 인스턴스 (SPOF)
├── CPU/메모리 제한 (t2.micro)
├── 데이터베이스 연결 수 제한
└── 네트워크 대역폭 (t2.micro: 낮음)
장점과 한계
장점
✅ 간단한 구조로 이해하기 쉬움
✅ 빠른 개발 및 배포 가능
✅ 비용 효율적 (소규모 프로젝트)
✅ Node.js 생태계 활용
✅ RDS 관리형 서비스 혜택
한계
❌ 단일 장애점 (SPOF)
❌ 확장성 제한
❌ 고가용성 부족
❌ 성능 병목 지점 다수
❌ 보안 취약점 가능성
Week 3로의 발전 경로
문제점과 해결 방안
문제: 웹 서버와 앱 서버가 하나의 EC2에 혼재
해결: Web/WAS 분리 아키텍처
문제: 단일 인스턴스 의존
해결: 다중 인스턴스 구성
문제: 확장성 부족
해결: 로드 밸런서 + Auto Scaling
다음 아키텍처 미리보기
Week 2 (현재):
사용자 → EC2 (Web+App) → RDS
Week 3 (목표):
사용자 → EC2 (Apache) → EC2 (Tomcat) → RDS
Week 2 완성: 데이터베이스 연동 동적 웹 애플리케이션 구축 완료
다음 단계: AWS EDU/Archive/조선대학교 AWS 멘토링/Edu Architecture/Week3-Three-Tier-Architecture - Web/WAS 분리로 확장성 향상